"""
   # File : Base.py
   # Time : 2021/12/13
   # Author : XGT
   # Version : V1.0.0
   # Description : Web自动化关键字封装
"""

import time
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait


# 生成一个浏览器(webdriver对象)
def browser(type_):
    """
    :param type_: 传入参数为浏览器的类型
    :return:浏览器对象
    :note:如果涉及到浏览器兼容，可增加if语句进行判断选择即可，但需要存在对应的webdriver
    """
    try:
        driver = getattr(webdriver,type_)()
    except Exception as e:
        driver = webdriver.Chrome()
    return driver


def DelStr(expStr):
    """
    :param expStr:html中的字符串
    :return:源字符串
    :note:为了排空，主要针对html中的空格，由于空格的出现，会导致断言失败。可酌情调用
    """
    TargetStr = str(expStr).strip()
    return TargetStr

class BaseOfWeb:
    """
       Web相关操作方法封装
       :**kwargs: Type: dict
                  Key : 'event':记录需要执行的动作，由Base关键字提供
                        'name':记录元素查找方法(selenium八大元素定位方法)
                        'value':根据name而定(如:xpath,则对应xpath路径)
                        'txt':需要输入文本参数的event才用到,比如文本框输入
                        'Des':操作描述
                        'except':预期结果,用于断言有实际结果返回的值
                  Value : Excel 表格中对应的值
    """

    # 驱动实例
    def __init__(self,type_):
        """
           实例化Driver
           显示等待10s
        """
        self.driver = browser(type_)
        self.driver.implicitly_wait(10)

    # 访问路径
    def open(self,**kwargs):
        """
           访问对应网址
        """
        self.driver.get(kwargs['txt'])

    # 退出浏览器
    def quit(self):
        """
           退出浏览器(不同于close)
           close : 关闭浏览器,不关闭session,不释放内存
           quit : 退出浏览器, 关闭session,释放内存
        """
        self.driver.quit()


    def max_windows(self,**kwargs):
        """
           窗口最大化
        """
        self.driver.maximize_window()


    # 定位元素
    def locator(self,**kwargs):
        """
           元素定位
           本文件核心方法
           name : 八大定位方法
           value : 对应的值,xpath路径,id等
        """
        return self.driver.find_element(kwargs['name'],kwargs['value'])

    # 清除文本框内容
    def clearText(self,**kwargs):
        """
           清除文本框内容
        """
        self.locator(**kwargs).clear()

    # 输入文本，sendkeys
    def input_(self,**kwargs):
        """
           输入文本
        """
        self.locator(**kwargs).send_keys(kwargs['txt'])

    # 获取定位控件的内容
    def get_text(self,**kwargs):
        """
           :return: 返回文本值
           用于做断言
        """
        return self.locator(**kwargs).text

    # 断言按钮的value
    def assert_value(self,**kwargs):
        """
           :return: 返回按钮的value
           用于断言按钮的文本
        """
        return self.locator(**kwargs).get_attribute('value')

    # 点击函数
    def click(self,**kwargs):
        """
           点击函数
        """
        self.locator(**kwargs).click()

    # 针对弹窗
    def assert_alert(self,**kwargs):
        """
           获取弹窗文本
           用于断言弹窗文本
        """
        al = self.driver.switch_to.alert
        return al.text


    def alert_click(self,**kwargs):
        """
           弹窗点击
        """
        al = self.driver.switch_to.alert
        al.accept()

    def alert_dismiss(self,**kwargs):
        """
           弹窗忽略无视
        """
        al = self.driver.switch_to.alert
        al.dismiss()


    # localtor(loc).text 浏览器结果
    # fact 实际结果
    def assert_text(self,**kwargs):
        """
           :return: 返回文本值
           用于做断言
        """
        return self.locator(**kwargs).text

    def assert_text_DelStr(self,**kwargs):
        """
           :return: 返回排空的字符串
           用于做断言
        """
        return DelStr(self.locator(**kwargs).text)

    # 强制等待
    def wait(self,**kwargs):
        """
           强制等待
        """
        time.sleep(kwargs['txt'])

    #显示等待
    def assert_wait(self,**kwargs):
        """
           显示等待
        """
        WebDriverWait(self.driver,kwargs['txt'],0.5).until(
            lambda el:self.locator(**kwargs),message='查找元素失败')

    # 截图
    def Screen_Photo(self,**kwargs):
        """
           浏览器截图
        """
        path = '../ScreenPhoto/'+kwargs['txt']+'.jpeg'
        # im1 = pyautogui.screenshot(path)
        self.driver.save_screenshot(path)

    # 不关闭切换
    def switch_no_close(self,**kwargs):
        """
           弹窗切换
           不关闭本来弹窗直接切换
        """
        handles = self.driver.window_handles
        self.driver.switch_to.window(handles[1])

    # 关闭切换
    def switch_with_close(self,**kwargs):
        """
           弹窗切换
           关闭原来弹窗切换新的弹窗
        """
        handles = self.driver.window_handles
        self.driver.close()
        self.driver.switch_to.window(handles[1])

    # 切换旧窗体
    def switch_to_old(self,**kwargs):
        """
            弹窗切换
            切换原来弹窗
        """
        handles = self.driver.window_handles
        self.driver.switch_to.window(handles[0])

    # 获取下拉框当前文本
    def select_text(self,**kwargs):
        """
           获取并返回下拉框当前文本
        """
        return Select(self.locator(**kwargs)).first_selected_option.text

    # 单表单切换
    def switch_frame(self,**kwargs):
        """
           用于表单切换，单表单切换
        """
        self.driver.switch_to.frame(kwargs['txt'])

    # 退出表单,最外层
    def exit_frame(self):
        """
           退出表单，直接到最外层
        """
        self.driver.switch_to.default_content()

    # 特殊处理，无可使用的id和name 表单处理
    def special(self,**kwargs):
        """
           特殊处理，无可使用的id和name 表单处理
        """
        ele_path = self.locator(**kwargs)
        self.driver.switch_to.frame(ele_path)

    # js脚本运行
    def execute_js(self,**kwargs):
        """
           运行Js脚本
        """
        self.driver.execute_script(kwargs['value'])

    # def __del__(self):
    #     self.driver